home *** CD-ROM | disk | FTP | other *** search
- TITL 'TMS32011 BASED 212A MODEM '
- IDT 'MAIN'
- OPTION XREF,TUNLST
- **********************************************************
- *** - DSP MODEM PROGRAM - ***
- **********************************************************
- *** TASKMASA.ASM --- This source contains the rewrite ***
- *** of the modem code to time slice ***
- *** the tasks and to operate with ***
- *** a CODEC device for operation on ***
- *** the demo board. ***
- *** This interum update executes the 9.6KHz sample ***
- *** rate. It includes the updates to operate with a ***
- *** CODEC device and a TMS32011. It interfaces to a ***
- *** TMS7041 device for the DTE interface. ***
- *** This version include experimental code to skip ***
- *** the FIR bandpass filter. It also will try some ***
- *** experimental code to fine tune carrier tracking. ***
- *** ***
- *** WRITTEN BY: PETER EHLIG ***
- *** ***
- *** COPYRIGHT TEXAS INSTRUMENTS, 07/25/86 ***
- *** ***
- **********************************************************
- DEF MASTER
- DEF BAUDST,BDCLK1,BDCLK2,DECODE
- DEF DEMOD,DEMODB,DUMMY,DUMXMT
- DEF GETDBT,OUT,TRENDS
- REF TSKSEQ,TSKXMT
- REF PLLC,BPLLC,WAIT,COMD,COEF,WAIT1
- PAGE
- COPY TASKMAS.EQU
- ***************************************************************
- * The following code is the time sliced code task master. *
- * The routine monitors the status of the modem operations *
- * and sequences the code appropriately. *
- ***************************************************************
- MASTER EQU $
- LAC ONE,4 CHECK OPERATING STATUS FOR
- AND RECST FOR CARRIER DETECT
- BNZ CARLCK IF CDT THEN RUN MODEM
- B NORMAL IF DETECTED EXECUTE NORMAL SEQUENCE
- DBUG1 NOP * STORE IN XMTOUT TO SEE ON SCOPE
- OUT ERRSIG,3 * FOR DEBUG PURPOSES
- OUT BEROUT,3 * FOR DEBUG PURPOSES
- OUT RECI,3 * FOR DEBUG PURPOSES
- OUT RECQ,3 * FOR DEBUG PURPOSES
- OUT DPOINT,3 * FOR DEBUG PURPOSES
- OUT CTRND,3 * FOR DEBUG PURPOSES
- *
- * UPDATE CARRIER ANGLE AT SAMPLE RATE
- *
- LAC RALPHA * COMPUTE ADDRESS OF NEXT
- ADD RDELTA * POINT FOR TABLE.
- AND MASK1 * KEEP MOD128, MASK=>7FFF.
- SACL RALPHA * SAVE NEXT ADDRESS
- LAC ONE,2 * SEE IF XMIT SQLCH BIT SET
- AND RECST * IN THE STATUS REGISTER
- BGZ WAIT1 *
- B MASXMT GO ON TO XMT TASK MASTER
- *
- CARLCK LACK PLLC
- TBLR PLL1
- LACK BPLLC
- TBLR BPLL1
- NORMAL EQU $
- LAC SAMPLE DECREMENT THE SAMPLE COUNT
- SUB ONE TO CHECK FOR END OF BAUD
- BGEZ OVRSAM IF NOT THEN SKIP COUNT RESET
- LACK 15 RESTART THE SAMPLE COUNTER AT 15
- OVRSAM SACL SAMPLE SAVE NEW COUNT VALUE
- LACK TSKSEQ GET ADDRESS OF TOP OF TABLE
- ADD SAMPLE ADD IN OFFSET
- TBLR TEMP GET THE PROGRAM ADDRESS
- LAC TEMP FOR THE TASK CALL
- CALA EXECUTE THE APPROPRIATE TASK
- B DBUG1 RETURN TO THE WAIT LOOP
- *
- MASXMT EQU $
- LAC SAMXMT DECREMENT THE SAMPLE COUNT
- SUB ONE TO CHECK FOR END OF BAUD
- BGEZ OVRSM1 IF NOT THEN SKIP COUNT RESET
- LACK 15 RESTART THE SAMPLE COUNTER AT 15
- OVRSM1 SACL SAMXMT SAVE NEW COUNT VALUE
- LACK TSKXMT GET ADDRESS OF TOP OF TABLE
- ADD SAMXMT ADD IN OFFSET
- TBLR TEMP GET THE PROGRAM ADDRESS
- LAC TEMP FOR THE TASK CALL
- CALA EXECUTE THE APPROPRIATE TASK
- B WAIT1 WAIT FOR NEXT SAMPLE TIMEOUT
- PAGE
- DUMXMT EQU $
- RET
- *
- ********************************************************
- *
- GETDBT EQU $
- IN XMTD,PA7 * GET NEW DIBIT
- LACK >30
- AND XMTD * CHECK COMMAND BITS
- BZ COMD * IF ZERO SQT MODEM, IDLE
- *
- LACK COEF * RECYCLE IF FINISHED
- SACL XPTR
- DMOV XIBUF1 * SHIFT UP THE FILTER
- DMOV XIBUF0 * TO MAKE ROOM FOR
- DMOV XQBUF1 * FOR THE NEW DATA VALUE
- DMOV XQBUF0 * JUST INPUT
- *
- LACK 3
- AND XMTD * NEW DIBIT FROM 7000
- ADD OFSET1 * LOOKUP NEWPHASE
- TBLR XNEWPH
- LAC XOLDPH * GET OLDPHASE.
- ADD XNEWPH * ADD NEW PHASE.
- AND MASK3 * MASK WITH >0006.
- SACL XOLDPH * STORE BACK 'NEW' OLDPHASE.
- ADD INDXPH * LOOKUP I & Q INPUTS.
- TBLR XIBUF0
- ADD ONE
- TBLR XQBUF0
- RET
- *
- DUMMY CALL DEMOD ATTEMPT DEMODULATION
- RET RETURN TO TASK MASTER
- *
- BAUDST EQU $ SHOW START OF BAUD
- LAC MASK1
- SACL DPOINT
- CALL DEMOD
- RET
- *
- PAGE
- *
- DEMODB EQU $
- ZAC
- SUB MASK1
- SACL DPOINT
- LACK >BF RESET THE CURRENT ZERO CROSSING
- AND RECST FLAG IN THE STATUS REGISTER AND
- SACL RECST SAVE IT (BIT6=0 FOR MIDDLE OF BAUD)
- **********************************************************
- ***** DEMODUATE THE PASSBAND SIGNAL. *****
- ********------------------------------------------********
- ***** RCVR. CARRIER SINE(COSINE) WAVE GENERATOR *****
- **********************************************************
- DEMOD EQU $
- LAC RALPHA,8 * DELTA IS THE INCREMENT.
- ADD ONE,15 * ROUND IT UP
- SACH TEMP * ISOLATE INTEGER PORTION.
- LAC TEMP * MASK TO WITH THE 128 WORD
- AND MASK2 * SINE TABLE
- ADD OFSET0 * ADD INDEX TO SINE TABLE.
- TBLR SINA * SINE VALUE, (Q15).
- LACK >20 * ADD 90 DEGREES TO
- ADD TEMP * THE ANGLE TO GET
- AND MASK2 * THE COSINE VALUE
- ADD OFSET0 * ADD INDEX TO COSINE TABLE.
- TBLR COSA * COSINE VALUE, (Q15).
- *
- *********************************************************
- *
- CONT1 EQU $
- LT ISUM
- MPY COSA * A=(Yi * cosA)/2
- PAC
- LT QSUM
- MPY SINA
- APAC * A=(Yi * cosA)/2 + (Yq * sin A)/2
- SACH RECI,1 * RECI= (Yi * cosA) + (Yq * sinA)
- *
- *---MUST DETERMINE SIGN OF I AND Q FOR ERROR CORRECTION---*
- *
- LAC RECI * DETERMINE SIGN OF I CHAN
- BGZ DM1
- LAC MINUS1
- B DM2
- DM1 LAC PLUS1
- DM2 SACL SIGNI * SAVE SIGN OF I
- LT ISUM
- MPY SINA
- PAC * A = (Yi * sinA)/2
- LT QSUM
- MPY COSA
- SPAC * A =[(Yi * sinA)/2] - [(Yq * cosA)/2]
- SACH RECQ,1 * RECQ = (Yi * sinA) - (Yq * cosA)
- *
- LAC RECQ * DETERMINE SIGN OF Q CHAN
- BGZ DM3
- LAC MINUS1
- B DM4
- DM3 LAC PLUS1
- DM4 SACL SIGNQ
- *
- *---MUST DETERMINE ENERGY FOR BAUD CLOCK ALLIGNMENT---*
- *
- LT RECI
- MPY RECI * FIND I**2
- PAC
- LT RECQ
- MPY RECQ * FIND Q**2
- APAC
- SACH ENRGY * ENERGY = (I**2) + (Q**2)
- *
- RET RETURN TO CALLING SEQUENCE
- ********------------------------------------------********
- ***** COMPUTE CARRIER ERROR SIGNAL. *****
- ***** e(t) = RECI*SIGNQ - RECQ*SIGNI *****
- ********------------------------------------------********
- COMERR ZAC
- LT RECI
- MPY SIGNQ
- LTA RECQ
- MPY SIGNI
- SPAC
- SACH ERROR,1 * ERROR IS IN Q12
- ********------------------------------------------********
- ***** LOOP FILTER ******
- ********------------------------------------------********
- ZAC
- LT PLL2
- MPY ERROR
- LTA PLL1
- MPY ERRSIG
- APAC
- SACH ERRSIG,1 * ERRSIG IS IN Q12
- *********************************************************
- * CORRECT PHASE ERROR ONLY AT MIDDLE OF BAUD *
- *********************************************************
- ************************************************************
- * Adjust carrier phase +/- *
- * one table entry if - (2*trshld) > error > trshld *
- * two table entries if - (2*trshld) < error >> trshld *
- * RALPHA is current local carrier table index.(in MSB ) *
- ************************************************************
- CKEROR LAC ERRSIG *
- BGZ ERR1 * If error is -ve add threshold
- ADD TRSHD1 *
- BGZ ERRETN * Still -ve?... add again
- ADD TRSHD1 *
- BGZ SUB1A * still -ve?...
- LAC CTRND * GET THE CARRIER UPDATE TREND
- SUB ONE,1 * ADD TWO
- SACL CTRND * AND SAVE IT
- LAC RALPHA * Error >> trshld; add 2 to index
- SUB ONE,9 *
- B DERR2 * DBUG CODE-TRAPS ON CDT LOSS
- SUB1A LAC CTRND * GET THE CARRIER UPDATE TREND
- SUB ONE * ADD ONE
- SACL CTRND * AND SAVE IT
- LAC RALPHA * Error > trshld; add 1 to index
- SUB ONE,8 *
- B ERR2 *
- ERR1 SUB TRSHD1 * Error ia +ve; subtract threshold
- BLZ ERRETN * Error > trshld
- SUB TRSHD1 * see if error >> trshld
- BLZ ADD1A * No...add one to index
- LAC CTRND * GET THE CARRIER UPDATE TREND
- ADD ONE,1 * SUBTRACT TWO
- SACL CTRND * AND SAVE IT
- LAC RALPHA * Yes...add 2 to index
- ADD ONE,9 * SUB 2 same as ADD >7E in modulo 128
- DERR2 AND MASK1
- SACL RALPHA
- LAC DBUGC COMPARE BAUD COUNT
- SUB ONE,11 TO 2048
- BLZ DERR3 IF < THEN SYSTEM NOT STABLE
- NOP ELSE ENABLE TRAP CODE
- NOP BY STARTING DBUGC2 COUNT
- DERR3 RET
- ADD1A LAC CTRND * GET THE CARRIER UPDATE TREND
- ADD ONE * SUBTRACT ONE
- SACL CTRND * AND SAVE IT
- LAC RALPHA *
- ADD ONE,8 *
- ERR2 AND MASK1 * Keep RALPHA modulo 128
- SACL RALPHA * save new index
- RET * Return with corrected RALPHA
- ERRETN LAC ONE,4
- OR RECST TO ACTIVE IN THE STATUS REGISTER
- SACL RECST AND SAVE IT
- RETA RET
- ******************************************************
- * OUT XMITS NEW DECODED DIBITS TO THE 7000
- *
- OUT EQU $
- LACK >3C * MASK IN CDT,EDT & SQLCH BITS
- AND RECST * FROM RECST REG.
- OR RDIBIT * TO THE DIBIT VALUE
- SACL BITOUT *AND SAVE THE SHIFTED VALUE
- OUT BITOUT,PA7 *XMIT TO 7000
- CALL DEMOD * DEMODULATE TO CONTINUE PLOT
- RET * BACK TO CALLER
- *
- ********------------------------------------------********
- ***** PHASE DECODING - BINARY TO GRAY CODE *****
- * THIS ROUTINE CALCULATES PHASE SHIFT FROM OLDPH TO THE *
- * CURRENT ABSOLUTE PHASE, GREY CODE RESULT TO GET DIBIT *
- ********------------------------------------------********
- DECODE EQU $
- OUT RECI,PA4
- OUT RECQ,PA4
- LAC RECI * DETERMINE ABSOLUTE PHASE
- BGZ ABS1
- LAC RECQ
- BGZ ABS2
- LACK 2 * PHASE IS 2 (0 deg)
- B DIFFER *
- ABS2 LACK 3 * PHASE IS 3 (270 deg)
- B DIFFER *
- ABS1 LAC RECQ
- BGZ ABS3
- LACK 1 * PHASE IS 1 (180 deg)
- B DIFFER *
- ABS3 LACK 0 * PHASE IS 0 (90 deg)
- * *
- DIFFER SACL TEMP
- SUB ROLDPH * SUBTRACT PREVIOUS ABSO-
- BGEZ DF1 * LUTE PHASE (BINARY CODED)
- ADD ONE,2 * ADD 4
- DF1 ADD RPHSE * MAP PHASE CHANGE TO DIBIT
- TBLR RDIBIT
- NOP
- LAC TEMP
- SACL ROLDPH
- CALL COMERR * COMPUTE ERROR USING PRESENT PHASE
- * AND CORRECT PHASE OF LOCAL CARRIER
- CALL DEMOD * DEMODULATE TO CONTINUE PLOT
- RET
- ***********************************************************
- ***** BAUD CLOCK ALLIGNMENT ****
- ***********************************************************
- BDCLK1 CALL DEMOD
- LAC ENRGY
- SACL PENRGY
- RET
- BDCLK2 CALL DEMOD
- LAC ONE,6
- AND RECST * TEST IF CORRECTION IS MADE
- BNZ RETB * IF SO RETURN
- LAC ENRGY
- SUB PENRGY * FORM ERROR SIGNAL
- SACL BERROR
- ********-------------------------------------------**********
- **** LOOP FILTER *******
- ********-------------------------------------------**********
- ZAC
- LT BPLL2
- MPY BERROR
- LTA BPLL1
- MPY BEROUT
- APAC
- SACH BEROUT,1 * BEROUT IN Q14
- *
- *---APPLY CORRECTION
- *
- LAC BEROUT
- BGEZ POS
- ADD TRSHD2
- BGEZ RETB
- ADD TRSHD2
- BGEZ SUB1B
- LAC SAMPLE
- SUB ONE,1
- SACL SAMPLE
- B RETB
- SUB1B LAC SAMPLE
- SUB ONE
- SACL SAMPLE
- B RETB
- POS SUB TRSHD2
- BLZ RETB
- SUB TRSHD2
- BLZ ADD1B
- LAC SAMPLE
- ADD ONE,1
- SACL SAMPLE
- B RETB
- ADD1B LAC SAMPLE
- ADD ONE
- SACL SAMPLE
- RETB LAC ONE,6
- OR RECST
- SACL RECST
- RET
- **************************************************************************
- PAGE
- ***********************************************************
- ***** CARRIER TREND UPDATE ****
- ***** ****
- ***** THIS ROUTINE CALCULATES THE CARRIER SHIFT ****
- ***** TRENDS OVER 16 BAUD INTERVALS (256 SAMPLES) ****
- ***** AND CALCULATES A FRACTIONAL VALUE TO INCREASE ****
- ***** (OR DECREASE) THE SINE TABLE STEP VALUE ****
- ***** ****
- ***********************************************************
- TRENDS EQU $
- CALL DEMOD DEMODULATE TO CONTINUE PLOT
- LAC ONE,4 CHECK OPERATING STATUS FOR
- AND RECST CARRIER DETECT
- BZ NOTYET IF NO CDT THEN DON'T UPDATE
- LAC TRNDCT DECREMENT TREND BAUD COUNT
- SUB ONE BY ONE TO SEE IF IT IS READY FOR
- BZ TUPDT NEXT UPDATE
- SACL TRNDCT NO, SKIP UPDATE
- NOTYET RET AND RETURN TO CALLING SEQUENCE
- *
- TUPDT LACK 16 RESET THE TREND BAUD COUNTER
- SACL TRNDCT TO 16 FOR NEXT BLOCK
- LAC CTRND GET THE TREND VALUE
- BLZ OTRND1 IF NEGATIVE HANDLE APPROPRIATELY
- SUB ONE,2 COMPARE IT TO 4
- BLEZ OTRND IF CTRND < 4 THEN
- LAC RDELTA GET THE SINE INCREMENT VALUE
- ADD ONE INCREMENT CARRIER DELTA
- SACL RDELTA AND SAVE IT
- OTRND ZAC CLEAR THE ACCUMULATOR
- SACL CTRND TO CLEAR OUT OLD TREND VALUE
- RET RETURN TO CALLING SEQUENCE
- OTRND1 ADD ONE,2 COMPARE TO -4
- BGEZ OTRND IF CTRND > -4 THEN
- LAC RDELTA GET THE SINE INCREMENT VALUE
- SUB ONE DECREMENT THE CARRIER DELTA
- SACL RDELTA AND SAV IT
- B OTRND AND FINISH
- *
- END